home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / MacTech® Magazine / Volume 07 - 1991 / 07.10 Oct 91 / Window Menubar Source ƒ / wBMMiscSubs.p < prev    next >
Encoding:
Text File  |  1991-07-25  |  12.0 KB  |  566 lines  |  [TEXT/PJMM]

  1. { ******************************************************** }
  2. { "wBMMiscSubs.p"                                          }
  3. {                                                          }
  4. { by John A. Love, III [ Washington Apple Pi Users' Group] }
  5. {                                                          }
  6. { using Symantec's "THINK Lightspeed Pascal", v 3.02       }
  7. {                                                          }
  8. { ******************************************************** }
  9.  
  10.  
  11. UNIT wBMMiscSubs;
  12.  
  13. INTERFACE
  14.  
  15.     USES
  16.         Types, Quickdraw, Menus, TextEdit, Traps, Sound, wBMGlobals;
  17.  
  18.  
  19.     PROCEDURE InitManagers;
  20.     FUNCTION TestForColor (VAR pixelDepth: INTEGER): BOOLEAN;
  21.     PROCEDURE LocalGlobal (VAR r: Rect);
  22.     PROCEDURE GlobalLocal (VAR r: Rect);
  23.     FUNCTION TrapAvailable (theTrap: INTEGER): BOOLEAN;
  24.     FUNCTION WNEisImplemented: BOOLEAN;
  25.     PROCEDURE PlaySound (mySound: Str255);
  26.     FUNCTION GetStripAddressMask: LONGINT;
  27.     FUNCTION QuickStrip (myPtr: Ptr): Ptr;
  28.     FUNCTION GetMouseMovement (gMouse0: Point): Size;
  29.     FUNCTION DoubleClick: BOOLEAN;
  30.     PROCEDURE DimRgn (rgn: RgnHandle);
  31.     FUNCTION Max (a, b: INTEGER): INTEGER;
  32.     FUNCTION Min (a, b: INTEGER): INTEGER;
  33.     FUNCTION GetWindowPartColor (window: WindowPtr; part: INTEGER; VAR color: RGBColor): BOOLEAN;
  34.     PROCEDURE InitBigScreen (VAR RadStatus: RadiusData; VAR fontSize: INTEGER);
  35.     PROCEDURE myTextSize (size: INTEGER);
  36.     FUNCTION xPOWERy (x, y: INTEGER): extended;
  37.  
  38.  
  39.  
  40.  
  41. IMPLEMENTATION
  42.  
  43.  
  44.  
  45.  
  46. { ==================================== }
  47. { No further explanation is required : }
  48. { ==================================== }
  49.  
  50.     PROCEDURE FatalSystemCrash;
  51.  
  52.     BEGIN
  53.         ExitToShell;
  54.     END;   { FatalSystemCrash }
  55.  
  56.  
  57.  
  58.     PROCEDURE MyMoreMasters (numMasterPtrs: INTEGER);
  59. { See Technical Note #53: }
  60.  
  61.         VAR
  62.             oldMoreMast: INTEGER;
  63.             zone: THz;
  64.  
  65.     BEGIN
  66.  
  67.         zone := GetZone;
  68.         WITH zone^ DO
  69.         BEGIN
  70.             oldMoreMast := moreMast;
  71.             moreMast := numMasterPtrs;
  72.             MoreMasters;                 { Calls itself "moreMast" times. }
  73.             moreMast := oldMoreMast;
  74.             IF MemError <> noErr THEN
  75.                 ExitToShell;
  76.         END;   { WITH }
  77.  
  78.     END;   { MyMoreMasters }
  79.  
  80.  
  81.  
  82.     PROCEDURE InitManagers;
  83.  
  84.     BEGIN
  85.  
  86.         MaxApplZone;
  87.         MyMoreMasters(15);
  88.         InitGraf(@thePort);
  89.         InitFonts;
  90.         InitWindows;
  91.         InitMenus;
  92.         TEInit;
  93.         InitDialogs(@FatalSystemCrash);
  94.         ;
  95.         FlushEvents(everyEvent, 0);
  96.         InitCursor;
  97.  
  98.     END;   { InitManagers }
  99.  
  100.  
  101.  
  102. { ================================================================================ }
  103. { Test for the presence of a Mac with Color QuickDraw and a Color Monitor that the }
  104. { user has set to Color via the Control Panel or using the "Switch-A-Roo" FKEY.    }
  105. {                                                                                  }
  106. { Return the color depth:                                                          }
  107. { ================================================================================ }
  108.  
  109.     FUNCTION TestForColor (VAR pixelDepth: INTEGER): BOOLEAN;
  110.  
  111.         VAR
  112.             theWorld: SysEnvRec;
  113.             whoCares: OSErr;          { Compiler's "glue" for _SysEnvirons fills-in }
  114.                                 { all fields EXCEPT .systemVersion.           }
  115.  
  116.     BEGIN
  117.  
  118.         whoCares := SysEnvirons(SysEnvironsVersion, theWorld);
  119.         IF theWorld.hasColorQD THEN
  120.         BEGIN
  121.             TestForColor := TRUE;
  122.             pixelDepth := GetGDevice^^.gdPMap^^.pixelSize;
  123.         END
  124.         ELSE
  125.         BEGIN
  126.             TestForColor := FALSE;
  127.             pixelDepth := 1;
  128.         END;
  129.  
  130.     END;  { TestForColor }
  131.  
  132.  
  133.  
  134. { =================== }
  135. { A short-cut or two: }
  136. { =================== }
  137.  
  138.     PROCEDURE LocalGlobal (VAR r: Rect);
  139.  
  140.     BEGIN
  141.  
  142.         WITH r DO
  143.         BEGIN
  144.             LocalToGlobal(topLeft);
  145.             LocalToGlobal(botRight);
  146.         END;
  147.  
  148.     END;   { LocalGlobal }
  149.  
  150.  
  151.  
  152.     PROCEDURE GlobalLocal (VAR r: Rect);
  153.  
  154.     BEGIN
  155.  
  156.         WITH r DO
  157.         BEGIN
  158.             GlobalToLocal(topLeft);
  159.             GlobalToLocal(botRight);
  160.         END;
  161.  
  162.     END;   { GlobalLocal }
  163.  
  164.  
  165.  
  166. { ==================================== }
  167. { Common to the routines that follow:  }
  168. { Reference: IM, Volume VI, Chapter 3: }
  169. { ==================================== }
  170.  
  171.     FUNCTION GetTrapType (theTrap: INTEGER): TrapType;
  172.  
  173.         CONST
  174.             TrapMask = $0800;               { Tests Bit #11. }
  175.  
  176.     BEGIN
  177.         IF BAND(theTrap, TrapMask) > 0 THEN
  178.             GetTrapType := ToolTrap
  179.         ELSE
  180.             GetTrapType := OSTrap;
  181.     END;   { GetTrapType }
  182.  
  183.  
  184.  
  185.     FUNCTION GetTrapNum (theTrap: INTEGER): INTEGER;
  186.  
  187.         CONST
  188.             ToolMask = $01FF;
  189.             OSMask = $00FF;
  190.  
  191.     BEGIN
  192.         IF GetTrapType(theTrap) = ToolTrap THEN
  193.             GetTrapNum := BAND(theTrap, ToolMask)
  194.         ELSE
  195.             GetTrapNum := BAND(theTrap, OSMask);
  196.     END;   { GetTrapNum }
  197.  
  198.  
  199.  
  200.     FUNCTION NumToolboxTraps: INTEGER;
  201.  
  202.         CONST
  203.             _InitGraf = $A86E;
  204.             _Magic = $AA6E;
  205.  
  206.     BEGIN
  207.         IF NGetTrapAddress(GetTrapNum(_InitGraf), GetTrapType(_InitGraf)) = NGetTrapAddress(GetTrapNum(_Magic), GetTrapType(_Magic)) THEN
  208.             NumToolboxTraps := $200
  209.         ELSE
  210.             NumToolboxTraps := $400;
  211.     END;   { NumToolboxTraps }
  212.  
  213.  
  214.  
  215.     FUNCTION TrapAvailable (theTrap: INTEGER): BOOLEAN;
  216.  
  217.         VAR
  218.             trapNum, tempINT: INTEGER;
  219.             tType: TrapType;
  220.  
  221.     BEGIN
  222.  
  223.         trapNum := GetTrapNum(theTrap);
  224.         tType := GetTrapType(theTrap);
  225.  
  226.         IF tType = ToolTrap THEN
  227.         BEGIN
  228.             tempINT := BXOR(theTrap, $A800);
  229.             IF tempINT >= NumToolboxTraps THEN
  230.                 trapNum := GetTrapNum(_Unimplemented);
  231.         END;   { a ToolTrap }
  232.  
  233.         TrapAvailable := NGetTrapAddress(trapNum, tType) <> NGetTrapAddress(GetTrapNum(_Unimplemented), GetTrapType(_Unimplemented));
  234.  
  235.     END;  { TrapAvailable }
  236.  
  237.  
  238.  
  239. { ============================================== }
  240. { Now, let's put this new fangled stuff to work: }
  241. { ============================================== }
  242.  
  243.     FUNCTION WNEisImplemented: BOOLEAN;
  244.  
  245.     BEGIN
  246.  
  247.         WNEisImplemented := TrapAvailable(_WaitNextEvent);
  248.  
  249.     END;  { WNEisImplemented }
  250.  
  251.  
  252.  
  253. { =============== }
  254. { Play it, Sam !! }
  255. { =============== }
  256.  
  257.     PROCEDURE PlaySound (mySound: Str255);
  258.  
  259.         VAR
  260.             sndHandle: Handle;
  261.             discardError: OSErr;
  262.  
  263.     BEGIN
  264.  
  265.         IF TrapAvailable(_SndPlay) THEN
  266.         BEGIN
  267.             sndHandle := GetNamedResource('snd ', mySound);
  268.             IF sndHandle <> NIL THEN
  269.             BEGIN
  270.                 discardError := SndPlay(NIL, sndHandle, FALSE);
  271.                 ReleaseResource(sndHandle);
  272.             END;
  273.         END;   { _SndPlay is implemented }
  274.  
  275.     END;  { PlaySound }
  276.  
  277.  
  278.  
  279.     FUNCTION GetStripAddressMask: LONGINT;
  280. { Adapted from Macintosh Tech Note #213 }
  281.  
  282.         CONST
  283.             gLo3Bytes = $00FFFFFF;
  284.             _StripAddress = $A055;
  285.  
  286.         VAR
  287.             localBiggee: LONGINT;
  288.  
  289.  
  290.     BEGIN
  291.  
  292.         IF TrapAvailable(_StripAddress) THEN
  293.         BEGIN
  294.             localBiggee := $FFFFFFFF;
  295.             GetStripAddressMask := LONGINT(StripAddress(Ptr(localBiggee)));
  296.         END
  297.         ELSE
  298.             GetStripAddressMask := gLo3Bytes;
  299.  
  300.     END;  { GetStripAddressMask }
  301.  
  302.  
  303.  
  304.     FUNCTION QuickStrip (myPtr: Ptr): Ptr;
  305.  
  306.     BEGIN
  307.         QuickStrip := Ptr(BAND(ORD4(myPtr), gStripAddressMask));
  308.     END;   { QuickStrip }
  309.  
  310.  
  311.  
  312. { ======================================================= }
  313. { Returns vertical movement in High word and horizontal   }
  314. { movement in low word, similar to _GrowWindow.           }
  315. {                                                         }
  316. { Note that the input Point is in GLOBAL coordinates.     }
  317. { Otherwise, dragging a window will return zero movement. }
  318. { ======================================================= }
  319.  
  320.     FUNCTION GetMouseMovement (gMouse0: Point): Size;
  321.  
  322.         VAR
  323.             mouseLoc: Point;
  324.             mouseDH, mouseDV: INTEGER;
  325.             sizeMove: Size;
  326.  
  327.     BEGIN
  328.  
  329.         GetMouse(mouseLoc);
  330.         LocalToGlobal(mouseLoc);            { ... apples with apples }
  331.         mouseDH := mouseLoc.h - gMouse0.h;
  332.         mouseDV := mouseLoc.v - gMouse0.v;
  333.         IF mouseDH < 0 THEN                { Absolute values ... }
  334.             mouseDH := -mouseDH;
  335.         IF mouseDV < 0 THEN
  336.             mouseDV := -mouseDV;
  337.         ;
  338.         sizeMove := mouseDV;
  339.         sizeMove := BSL(sizeMove, 16);      { ... into High word. }
  340.         sizeMove := sizeMove + mouseDH;     {  +  the low word.   }
  341.         GetMouseMovement := sizeMove;
  342.  
  343.     END;   { GetMouseMovement }
  344.  
  345.  
  346.  
  347. { ================================= }
  348. { Note that the algorithm I used    }
  349. { returns FALSE if we are dragging. }
  350. { ================================= }
  351.  
  352.     FUNCTION DoubleClick: BOOLEAN;
  353.  
  354.         VAR
  355.             startTime, endTime, doubleTime: LONGINT;
  356.             mouseLoc0: Point;
  357.             sizeMove: Size;
  358.  
  359.     BEGIN   { DoubleClick }
  360.  
  361.         DoubleClick := FALSE;               { Assume Nada !! }
  362.         doubleTime := GetDblTime;
  363.  
  364.         startTime := TickCount;             { Initialize time & mouse location. }
  365.         endTime := startTime;
  366.         GetMouse(mouseLoc0);
  367.         LocalToGlobal(mouseLoc0);
  368.  
  369.         WHILE StillDown & ((endTime - startTime) <= doubleTime) DO   { First mouse click. }
  370.             endTime := TickCount;             { Times out if dragging ... }
  371.  
  372.         sizeMove := GetMouseMovement(mouseLoc0);
  373.         ;
  374.         WHILE ((endTime - startTime) <= doubleTime) & (LoWord(sizeMove) <= 5) & (HiWord(sizeMove) <= 5) DO
  375.         BEGIN
  376.             IF Button THEN
  377.             BEGIN
  378.                 DoubleClick := TRUE;            { Second time's a charm !! }
  379.                 Leave;
  380.             END;   { IF Button }
  381.             ;
  382.             endTime := TickCount;
  383.             sizeMove := GetMouseMovement(mouseLoc0);
  384.         END;   { WHILE small delta Time AND small delta movement }
  385.  
  386.     END;   { DoubleClick }
  387.  
  388.  
  389.  
  390.     PROCEDURE DimRgn (rgn: RgnHandle);
  391.  
  392.         VAR
  393.             pState: PenState;
  394.  
  395.  
  396.     BEGIN
  397.  
  398.         GetPenState(pState);
  399.         PenPat(gray);
  400.         PenMode(patBic);
  401.         PaintRgn(rgn);
  402.         SetPenState(pState);
  403.  
  404.     END;   { DimRgn }
  405.  
  406.  
  407.  
  408.     FUNCTION Max (a, b: INTEGER): INTEGER;
  409.  
  410.  
  411.     BEGIN
  412.         IF a >= b THEN
  413.             Max := a
  414.         ELSE
  415.             Max := b;
  416.     END;   { Max }
  417.  
  418.  
  419.  
  420.     FUNCTION Min (a, b: INTEGER): INTEGER;
  421.  
  422.  
  423.     BEGIN
  424.         IF a <= b THEN
  425.             Min := a
  426.         ELSE
  427.             Min := b;
  428.     END;   { Min }
  429.  
  430.  
  431.  
  432. { --------------------------------------------- }
  433. { This odd-ball is here to avoid circularity of }
  434. { USES between wBarMenuProc.p & wBMWindSubs.p   }
  435. { --------------------------------------------- }
  436.  
  437.     FUNCTION GetWindowPartColor (window: WindowPtr; part: INTEGER; VAR color: RGBColor): BOOLEAN;
  438.  
  439.         VAR
  440.             auxWindowHdl: AuxWinHndl;
  441.             windowCTab: CTabHandle;
  442.  
  443.     BEGIN
  444.  
  445.         GetWindowPartColor := FALSE;                             { Assume NADA !! }
  446.         ;
  447.         IF NOT aMac2 THEN
  448.             EXIT(GetWindowPartColor);
  449.  
  450.         IF GetAuxWin(window, auxWindowHdl) THEN
  451.         BEGIN
  452.             windowCTab := auxWindowHdl^^.awCTable;
  453.             IF (part < 0) | (part > windowCTab^^.ctSize) THEN     { Color me paranoid !! }
  454.                 EXIT(GetWindowPartColor);
  455.             color := windowCTab^^.ctTable[part].rgb;
  456.             GetWindowPartColor := TRUE;
  457.         END;   { IF window has a AuxWinRec }
  458.  
  459.     END;   { GetWindowPartColor }
  460.  
  461.  
  462.  
  463.     PROCEDURE InitBigScreen (VAR RadStatus: RadiusData; VAR fontSize: INTEGER);
  464.  
  465.         CONST
  466.             largeMenuBar = 5;                 { Bit # in CPFlags field for non-MacII. }
  467.             RadInfoID = 0;
  468.  
  469.         VAR
  470.             statusHdl, pivotHand: Handle;
  471.  
  472.  
  473.     BEGIN
  474.  
  475.         SetResLoad(TRUE);
  476.  
  477.         pivotHand := GetNamedResource('INFO', 'Radius Pivot Display');
  478.         IF pivotHand = NIL THEN
  479.             LoadResource(pivotHand);
  480.         RadStatus.PivotHdl := PivotDSHand(pivotHand);
  481.  
  482.         IF NOT aMac2 THEN
  483.             statusHdl := GetNamedResource('INFO', 'Radius Display')
  484.         ELSE
  485.             statusHdl := GetNamedResource('INFO', 'Radius II Display');
  486.  
  487.         IF statusHdl = NIL THEN
  488.         BEGIN
  489.             LoadResource(statusHdl);
  490.             IF statusHdl = NIL THEN          { Still !!! }
  491.             BEGIN
  492.                 RadStatus.radType := none;
  493.                 fontSize := normalSize;
  494.                 EXIT(InitBigScreen);
  495.             END;   { STILL! }
  496.         END;   { Zip }
  497.  
  498.         IF NOT aMac2 THEN
  499.         BEGIN
  500.             IF BTST(RadBWStatHdl(statusHdl)^^.CPFlags, largeMenuBar) THEN
  501.             BEGIN
  502.                 RadBWStatHdl(statusHdl)^^.LargeFontEn := chr(1);
  503.                 AddResource(statusHdl, 'INFO', RadInfoID, 'Radius Display');
  504.                 fontSize := chicago16;
  505.       { ID = 128 * font number + size: }
  506.                 BIGfont := GetResource('FONT', 128 * systemFont + chicago16);
  507.                 IF BIGfont = NIL THEN
  508.                     LoadResource(BIGfont);
  509.                 RadBWStatHdl(statusHdl)^^.LargeFontEn := chr(0);
  510.                 RadBWStatHdl(statusHdl)^^.PluggedIn := chr(0);
  511.                 AddResource(statusHdl, 'INFO', RadInfoID, 'Radius Display');
  512.             END
  513.             ELSE
  514.                 fontSize := normalSize;
  515.             ;
  516.             RadStatus.radType := radBW;
  517.             RadStatus.BWHdl := RadBWStatHdl(statusHdl);
  518.         END
  519.  
  520.         ELSE   { aMac2 }
  521.  
  522.         BEGIN
  523.             IF ord(RadIIStatHdl(statusHdl)^^.LargeMenus) <> 0 THEN
  524.             BEGIN
  525.                 fontSize := chicago16;
  526.                 BIGfont := GetResource('FONT', 128 * systemFont + chicago16);
  527.                 IF BIGfont = NIL THEN
  528.                     LoadResource(BIGfont);
  529.             END
  530.             ELSE
  531.                 fontSize := normalSize;
  532.             ;
  533.             RadStatus.radType := radII;
  534.             RadStatus.IIHdl := RadIIStatHdl(statusHdl);
  535.         END;
  536.  
  537.     END;   { InitBigScreen }
  538.  
  539.  
  540.  
  541.     PROCEDURE myTextSize (size: INTEGER);
  542.  
  543.         CONST
  544.             CurFMFamily = $988;
  545.             FONDID = $BC6;
  546.  
  547.     BEGIN
  548.  
  549.         TextSize(size);
  550.         wordPtr(CurFMFamily)^ := -1;     { Invalidate FM cache ... }
  551.         wordPtr(FONDID)^ := -1;
  552.  
  553.     END;   { myTextSize }
  554.  
  555.  
  556.  
  557.     FUNCTION xPOWERy (x, y: INTEGER): extended;
  558.  
  559.     BEGIN
  560.         xPOWERy := exp(y * ln(x));
  561.     END;   { xPOWERy }
  562.  
  563.  
  564.  
  565.  
  566. END.   { UNIT = wBMMiscSubs }